From 654740b4bd8dfb358a9cf6876e60b79395a1d1fb Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Thu, 2 Mar 2017 18:36:54 +0000 Subject: [PATCH] tools/insn-fuzz: Don't hit memcpy() for zero-length reads For control-flow changes, the emulator needs to perform a zero-length instruction fetch at the target offset. It also passes NULL for the destination buffer, as there is no instruction stream to collect. This trips up UBSAN when passed to memcpy(), as passing NULL is undefined behaviour per the C spec (irrespective of passing a size of 0). Special case these fetches in fuzz_insn_fetch() before reaching data_read(). Signed-off-by: Andrew Cooper Acked-by: George Dunlap Reviewed-by: Jan Beulich --- tools/fuzz/x86_instruction_emulator/fuzz-emul.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/fuzz/x86_instruction_emulator/fuzz-emul.c b/tools/fuzz/x86_instruction_emulator/fuzz-emul.c index 65c5a3bcf3..64b7fb230e 100644 --- a/tools/fuzz/x86_instruction_emulator/fuzz-emul.c +++ b/tools/fuzz/x86_instruction_emulator/fuzz-emul.c @@ -117,6 +117,16 @@ static int fuzz_insn_fetch( unsigned int bytes, struct x86_emulate_ctxt *ctxt) { + /* + * Zero-length instruction fetches are made at the destination of jumps, + * to perform segmentation checks. No data needs returning. + */ + if ( bytes == 0 ) + { + assert(p_data == NULL); + return maybe_fail("insn_fetch", true); + } + return data_read("insn_fetch", p_data, bytes); } -- 2.30.2